import dayjs, { type Dayjs } from 'dayjs'
import 'dayjs/locale/zh-cn'
import relativeTime from 'dayjs/plugin/relativeTime'
import duration from 'dayjs/plugin/duration'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'
import customParseFormat from 'dayjs/plugin/customParseFormat'

// 扩展dayjs插件
dayjs.extend(relativeTime)
dayjs.extend(duration)
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)

// 设置中文语言
dayjs.locale('zh-cn')

/**
 * 格式化日期时间
 * @param date 日期对象、时间戳或日期字符串
 * @param format 格式化模板，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 */
export function formatDate(date: string | number | Date | Dayjs, format = 'YYYY-MM-DD HH:mm:ss'): string {
    return dayjs(date).format(format)
}

/**
 * 格式化为相对时间
 * @param date 日期对象、时间戳或日期字符串
 * @returns 相对时间字符串，如："2小时前"
 */
export function formatRelativeTime(date: string | number | Date | Dayjs): string {
    return dayjs(date).fromNow()
}

/**
 * 获取当前时间戳
 * @returns 当前时间戳（毫秒）
 */
export function getCurrentTimestamp(): number {
    return dayjs().valueOf()
}

/**
 * 获取今天的开始时间
 * @returns 今天00:00:00的Dayjs对象
 */
export function getStartOfToday(): Dayjs {
    return dayjs().startOf('day')
}

/**
 * 获取今天的结束时间
 * @returns 今天23:59:59的Dayjs对象
 */
export function getEndOfToday(): Dayjs {
    return dayjs().endOf('day')
}

/**
 * 计算两个日期之间的差值
 * @param date1 第一个日期
 * @param date2 第二个日期
 * @param unit 单位：'day' | 'hour' | 'minute' | 'second'
 * @returns 差值数字
 */
export function getDiffBetweenDates(
    date1: string | number | Date | Dayjs,
    date2: string | number | Date | Dayjs,
    unit: 'day' | 'hour' | 'minute' | 'second' = 'day'
): number {
    return dayjs(date1).diff(dayjs(date2), unit)
}

/**
 * 判断是否为今天
 * @param date 要判断的日期
 * @returns 是否为今天
 */
export function isToday(date: string | number | Date | Dayjs): boolean {
    return dayjs(date).isSame(dayjs(), 'day')
}

/**
 * 判断是否为本周
 * @param date 要判断的日期
 * @returns 是否为本周
 */
export function isThisWeek(date: string | number | Date | Dayjs): boolean {
    return dayjs(date).isSame(dayjs(), 'week')
}

/**
 * 判断是否为本月
 * @param date 要判断的日期
 * @returns 是否为本月
 */
export function isThisMonth(date: string | number | Date | Dayjs): boolean {
    return dayjs(date).isSame(dayjs(), 'month')
}

/**
 * 添加时间
 * @param date 基础日期
 * @param amount 添加的数量
 * @param unit 时间单位
 * @returns 新的Dayjs对象
 */
export function addTime(
    date: string | number | Date | Dayjs,
    amount: number,
    unit: dayjs.ManipulateType
): Dayjs {
    return dayjs(date).add(amount, unit)
}

/**
 * 减去时间
 * @param date 基础日期
 * @param amount 减去的数量
 * @param unit 时间单位
 * @returns 新的Dayjs对象
 */
export function subtractTime(
    date: string | number | Date | Dayjs,
    amount: number,
    unit: dayjs.ManipulateType
): Dayjs {
    return dayjs(date).subtract(amount, unit)
}

// 导出dayjs实例供直接使用
export { dayjs }
export default dayjs